import 'byte_util.dart';

/// CRC16 校验
class CRC16 {
  CRC16._(); // 私有构造函数，防止实例化

  /// 计算CRC-16的辅助函数
  /// [initialValue] 初始值，默认0x00
  /// [polynomial] 多项式，默认0x1021
  /// 例如：47 54 82 04 00 03 01 d8 ff
  /// 返回：[0xc9, 0x52]
  static List<int> crc16(List<int> bytes,
      {int initialValue = 0x00, int polynomial = 0x1021}) {
    var crc = initialValue;
    for (var i = 0; i < bytes.length; i++) {
      crc ^= (bytes[i] << 8);
      for (var j = 0; j < 8; j++) {
        if (crc & 0x8000 != 0) {
          crc = (crc << 1) ^ polynomial;
        } else {
          crc <<= 1;
        }
      }
    }
    crc = crc & 0xFFFF;
    return ByteUtil.shortToByteArray(crc);
  }
}
